package com.itcam.otcbackend.infrastructure.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * Spring MVC Json 配置
 */
@JsonComponent
public class JsonConfig {

    /**
     * 添加 Long 转 json 精度丢失的配置
     *
     * 此方法创建一个自定义的 ObjectMapper 实例，用于处理 Java 对象和 JSON 数据之间的转换。
     * 为了解决 Long 类型在转换为 JSON 时可能出现的精度丢失问题，该方法会注册一个自定义的序列化器，
     * 将 Long 类型和 long 基本类型序列化为字符串。
     *
     * @param builder Jackson2ObjectMapperBuilder 实例，用于创建 ObjectMapper
     * @return 配置好的 ObjectMapper 实例
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 使用 Jackson2ObjectMapperBuilder 创建一个非 XML 映射的 ObjectMapper 实例
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 创建一个简单的模块，用于注册自定义的序列化器
        SimpleModule module = new SimpleModule();
        // 为 Long 类注册一个序列化器，将 Long 类型序列化为字符串，避免精度丢失
        module.addSerializer(Long.class, ToStringSerializer.instance);
        // 为 long 基本类型注册一个序列化器，将 long 类型序列化为字符串，避免精度丢失
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        // 将自定义模块注册到 ObjectMapper 中
        objectMapper.registerModule(module);
        // 返回配置好的 ObjectMapper 实例
        return objectMapper;
    }

}
